using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;
using System.Collections;
using System.Dynamic;
using System.ComponentModel.DataAnnotations;

namespace TimeTableManagement.Entities
{
    /// <summary>
    /// 
    /// </summary>
    public class Tb_Role
    {
        public Tb_Role()
        {
            this.Tb_Userlogin = new List<Tb_Userlogin>();
        }

        public int id { get; set; }
        [Required]
        [Display(Name = "Role Name")]
        public string rolename { get; set; }
        [Required]
        [Display(Name = "Role Value")]
        public string value { get; set; }
        [Display(Name = "Role Description")]
        [DataType(DataType.MultilineText)]
        [System.Web.Mvc.AllowHtml]
        public string description { get; set; }
        public virtual ICollection<Tb_Userlogin> Tb_Userlogin { get; set; }
        /// <summary>
        /// Hàm lấy ra chuỗi JSON quy định role cho user
        /// </summary>
        /// <param name="id_role">id role, trong bảng Tb_Role</param>
        /// <returns>Chuỗi JSON có dạng {"m":"adm","t":"Administrator","r":15}</returns>
        public String getRoleString(int id_role)
        {
            QLSVContext db = new QLSVContext();
            Tb_Role tb_role = db.Tb_Role.Find(id_role);
            db.Dispose();
            return tb_role.value.ToString();
        }
        /// <summary>
        /// Hàm lấy giá trị của role tương ứng với module chỉ định
        /// </summary>
        /// <param name="module">String, mã module, hoặc tên module</param>
        /// <param name="id_role">int, mã role trong bảng Tb_Role</param>
        /// <returns>int, number quy định quyền hạn của role đối với module</returns>
        public int getRoleInt(String module, int id_role)
        {
            QLSVContext db = new QLSVContext();
            Tb_Role tb_role = db.Tb_Role.Find(id_role);
            String value = tb_role.value.ToString();
            JavaScriptSerializer jss = new JavaScriptSerializer();
            List<Role> listrole = jss.Deserialize<List<Role>>(value);
            foreach (Role r in listrole)
            {
                if (r.m.Equals(module) || r.t.Equals(module))
                    return r.r;
            }
            db.Dispose();
            return 0;
        }
        /// <summary>
        /// Lấy ra danh sách các Role cho từng module
        /// </summary>
        /// <param name="id">id role trong bảng Tb_Role</param>
        /// <returns>Trả về List các đối tượng Role</returns>
        public List<Role> getRoleModule(int id)
        {
            String jsontext = this.getRoleString(id);
            JavaScriptSerializer jss = new JavaScriptSerializer();
            List<Role> listrole = jss.Deserialize<List<Role>>(jsontext);
            if (listrole != null)
                return listrole;
            return null;
        }
        /// <summary>
        /// Lấy ra quyền hạn của user đối với module
        /// </summary>
        /// <param name="username">id_user trong bảng Tb_Userlogin</param>
        /// <param name="module">Mã module (3 ký tự) hoặc tên module</param>
        /// <returns>Số từ 0 đến 15 đại diện cho quyền của user đối với module. 
        /// Trả về -1 nếu không tồn tại module đã đưa vào</returns>
        public int getPermission(String username, String module)
        {
            QLSVContext db = new QLSVContext();
            TimeTableManagement.Controllers.AccountController a =
                new TimeTableManagement.Controllers.AccountController();
            int id_user = a.getID(username);
            Tb_Userlogin userlogin = db.Tb_Userlogin.Find(id_user);
            int id_role = userlogin.id_role;
            int per = new Tb_Role().getRoleInt(module, id_role);
            if (per >= 0 && per <= 15) return per;
            a.Dispose();
            db.Dispose();
            return -1;
        }
        /// <summary>
        /// Được phép hay không được phép tương tác (view, create, edit, delete) vào module
        /// </summary>
        /// <param name="username">Tên đăng nhập của user</param>
        /// <param name="module">Tên module</param>
        /// <param name="permiss">Tên quyền: view, create, edit, delete</param>
        /// <returns>True: có quyền. False: không có quyền</returns>
        public bool getPermission(String username, String module, String permiss)
        {
            int _r = this.getPermission(username, module);
            string binValue = Convert.ToString(_r, 2);
            if (binValue.Length == 3) binValue = "0" + binValue;
            if (binValue.Length == 2) binValue = "00" + binValue;
            if (binValue.Length == 1) binValue = "000" + binValue;
            if (binValue.Length != 0)
                switch (permiss)
                {
                    case "view":
                        if (String.Compare(binValue.Substring(0, 1), "1") == 0)
                            return true;
                        break;
                    case "create":
                        if (String.Compare(binValue.Substring(1, 1), "1") == 0)
                            return true;
                        break;
                    case "edit":
                        if (String.Compare(binValue.Substring(2, 1), "1") == 0)
                            return true;
                        break;
                    case "delete":
                        if (String.Compare(binValue.Substring(3, 1), "1") == 0)
                            return true;
                        break;
                }
            return false;
        }
        public String getPermission(int role, String action)
        {
            string binValue = Convert.ToString(role, 2);
            if (binValue.Length == 3) binValue = "0" + binValue;
            if (binValue.Length == 2) binValue = "00" + binValue;
            if (binValue.Length == 1) binValue = "000" + binValue;
            if (binValue.Length != 0)
                switch (action)
                {
                    case "view":
                        if (String.Compare(binValue.Substring(0, 1), "1") == 0)
                            return "x";
                        break;
                    case "create":
                        if (String.Compare(binValue.Substring(1, 1), "1") == 0)
                            return "x";
                        break;
                    case "edit":
                        if (String.Compare(binValue.Substring(2, 1), "1") == 0)
                            return "x";
                        break;
                    case "delete":
                        if (String.Compare(binValue.Substring(3, 1), "1") == 0)
                            return "x";
                        break;
                }
            return "";
        }
    }
    /// <summary>
    /// Mỗi role được đại diện bằng lớp này. 
    /// Trong đó có: m là module (code, 3 ký tự), t là title, r là số int quy định cho role.
    /// </summary>
    public class Role
    {
        String _module;
        String _title;
        int _role;
        public String m
        {
            get { return _module; }
            set { _module = value; }
        }
        public String t
        {
            get { return _title; }
            set { _title = value; }
        }
        public int r
        {
            get { return _role; }
            set { _role = value; }
        }

    }
}

